From 14162d298b6f8edb01a8c82e0c18110ed686ead7 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 30 Sep 2009 08:44:57 +0100 Subject: [PATCH] xend: Fix memory leaks in libxc python bindings Reference counters are not correctly decreased for python object in several places in python bindings for libxc. Most of them are around PyList_Append(), which unlike PyList_SetItem() does increment reference counter of the object being added to a list. Signed-off-by: Jiri Denemark --- tools/python/xen/lowlevel/xc/xc.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c index 3bff6a7f97..a1c39e48d5 100644 --- a/tools/python/xen/lowlevel/xc/xc.c +++ b/tools/python/xen/lowlevel/xc/xc.c @@ -387,8 +387,11 @@ static PyObject *pyxc_vcpu_getinfo(XcObject *self, cpulist = PyList_New(0); for ( i = 0; cpumap != 0; i++ ) { - if ( cpumap & 1 ) - PyList_Append(cpulist, PyInt_FromLong(i)); + if ( cpumap & 1 ) { + PyObject *pyint = PyInt_FromLong(i); + PyList_Append(cpulist, pyint); + Py_DECREF(pyint); + } cpumap >>= 1; } PyDict_SetItemString(info_dict, "cpumap", cpulist); @@ -1104,22 +1107,31 @@ static PyObject *pyxc_physinfo(XcObject *self) { PyObject *cpus = PyList_New(0); for ( j = 0; j <= max_cpu_id; j++ ) - if ( i == map[j]) - PyList_Append(cpus, PyInt_FromLong(j)); + if ( i == map[j]) { + PyObject *pyint = PyInt_FromLong(j); + PyList_Append(cpus, pyint); + Py_DECREF(pyint); + } PyList_Append(node_to_cpu_obj, cpus); + Py_DECREF(cpus); } node_to_memory_obj = PyList_New(0); for ( i = 0; i < info.nr_nodes; i++ ) { + PyObject *pyint; + xc_availheap(self->xc_handle, 0, 0, i, &free_heap); - PyList_Append(node_to_memory_obj, - PyInt_FromLong(free_heap / 1024)); + pyint = PyInt_FromLong(free_heap / 1024); + PyList_Append(node_to_memory_obj, pyint); + Py_DECREF(pyint); } PyDict_SetItemString(ret_obj, "node_to_cpu", node_to_cpu_obj); + Py_DECREF(node_to_cpu_obj); PyDict_SetItemString(ret_obj, "node_to_memory", node_to_memory_obj); + Py_DECREF(node_to_memory_obj); return ret_obj; #undef MAX_CPU_ID -- 2.30.2